#include "mysqlapi.h"

using std::string;

MYSQL *MysqlAPI::mysql_ = nullptr;
MYSQL_RES *MysqlAPI::res_ = nullptr;
const char *MysqlAPI::error_ = "";
string MysqlAPI::database_ = "warehouse_management_system";
string MysqlAPI::host_ = "";
string MysqlAPI::user_ = "";
string MysqlAPI::password_ = "";

bool MysqlAPI::Connect(const std::string &database) {
    mysql_ = mysql_init(nullptr);
    return nullptr != mysql_real_connect(mysql_, host_.c_str(), user_.c_str(), password_.c_str(), database.c_str(), 0, nullptr, 0);
}

void MysqlAPI::Close() {
    mysql_close(mysql_);
}

int MysqlAPI::Execute(const std::string &sentence) {
    if (0 != mysql_real_query(mysql_, sentence.c_str(), sentence.size()))
        return 2;  // 返回错误类型非空，说明执行失败

    res_ = mysql_store_result(mysql_);
    if (nullptr == res_ && '\0' != mysql_error(mysql_)[0])
        return 2;  // 返回值为空 且 错误内容不为空，说明执行失败

    if (nullptr == res_)
        return 1;  // 返回值为空 且 错误类型为空，说明此时 mysql 语句没有返回值

    return 0;
}

std::string MysqlAPI::Error() {
    return error_;
}

std::vector<std::vector<std::string>> MysqlAPI::Ans() {
    std::vector<std::vector<std::string>> ret;
    long long col_amount = mysql_num_fields(res_);  // 获得结果列数
    MYSQL_ROW row = mysql_fetch_row(res_);    // 使用 row 指向结果的一行，注意 row 数组越界
    for (; nullptr != row; row = mysql_fetch_row(res_)) {
        ret.push_back(std::vector<std::string>());  // 新增一行
        for (int i = 0; i < col_amount; ++i)        // 新增各列
            if (row[i] != nullptr)
                ret.back().push_back(row[i]);
            else
                ret.back().push_back("null");
    }
    return std::move(ret);
}
